package com.vcg.vdam;

/**
 * @ClassName TestVolatile
 * @Description 讲的真心好：https://www.cnblogs.com/xd502djj/p/9873067.html
 * @Author yangxing02
 * @Date 2020/11/10 10:56
 * @Version 1.0
 */

//对关键词的理解：线程栈保存了线程运行时候变量值信息。当线程访问某一个对象时候值的时候，首先通过对象的引用找到对应在堆内存的变量的值，然后把堆内存
//变量的具体值load到线程本地内存中，建立一个变量副本，之后线程就不再和对象在堆内存变量值有任何关系，而是直接修改副本变量的值，
public class TestVolatile extends Thread{
    //如果这个flag不加volatile;那么在main方法中不会暂停那个子线程;
    //这就解释了为什么在主线程（main）中设置了vt.flag = true; 而vt线程在进行判断flag的时候拿到的仍然是false。那就是因为vt线程每次判断flag标记的时候是从它自己的“工作内存中”取值，而并非从主内存中取值！
    boolean flag = false;
      int i = 0;

              public void run() {
                 while (!flag) {
                         i++;
                    }
             }

            public static void main(String[] args) throws Exception {
                TestVolatile vt = new TestVolatile();
                vt.start();
                Thread.sleep(2000);
                vt.flag = true;
                System.out.println("stope" + vt.i);
            }
 }
